﻿/*
    Mój pomysł na migrację projektu do Graphics View.


    Główne cele:
     * Migracja na Graphics View
     * Wykorzystanie stworzonych wcześniej klas Bezier, NURBS, (...)
     * Poprawienie elastyczności projektu

    ===================================================================

    1. Krzywe
    1.1 Wstęp

    Myślę nad stworzeniem klasy elementu graficznego dla krzywej,
    który będzie spełniał rolę pośrednika pomiędzy światem grafiki, a światem
    obliczeń.

    Klasa ta będzie podklasą QGraphicsItem, wykorzystującą stworzone dotychczas
    klasy krzywych.

    #################################
    |          CurveItem
    #################################
    |   Pola
    |    + Curve * numCurve
    |   Implementacje
    |    @ paint()
    |    @ boundingRect()
    |    @ shape()
    |   Metody
    |    -

    gdzie Curve to stary, dobry ICurve<QPointF>, z całą rodzinką Bezierów
    i sklejaków :)


    Taki, powiedzmy, CurveItem będzie dziedziczył po QGraphicsItem,
    reimplementując interfejs paint(), boundingRect() oraz shape().

    1.2 Rysowanie

    Element rysuje się na podstawie informacji z pola numCurve
    (o których zakłada się, że są aktualne).

    1.3 Elementy sterujące

    Podstawową częścią krzywej jest... krzywa. To znaczy kolorowa, krzywa linia
    na ekranie, dlatego jej rysowaniem powinien zajmować się obiekt macierzysty,
    a pozostałe elementy, takie jak uchwyty punktów kontrolnych i tym podobne,
    powinny być potomkami tego obiektu, w sensie pokrewieństwa w drzewie
    QGraphicsItem.

    To wydaje się być zgodne z intuicjią, bowiem te elementy są ściśle powiązane
    z krzywą.

    Na temat relacji rodzinnych elementów Graphics View w 17m30s filmu:
    http://developer.qt.nokia.com/elearning/watch/programming_with_qt_qgraphicsview_by_ics

    1.4 Typy krzywych

    Pomyślmy o tym ile klas podobnych tej będziemy potrzebować.
    Wydaje się, że wystarczy tylko jedna, bowiem klasa zaprząta sobie głową
    tylko i wyłącznie pobraniem punktów do rysunku z pola numCurve i narysowaniem
    go.

    Zastanawia mnie jednak jedna rzecz: NURBS musi mieć możliwość kolorowania
    odcinków pomiędzy węzłami, więc klasa Curve musi być świadoma tego czy typ
    pola numCurve jest Bezier, NURBS, czy inny. Być może wystarczy zastosowanie
    enum'a z typami.

    | Notka:
    | pola enum dobrze jest umieszczać wewnątrz klasy, co pozwala na zwiększenie
    | czytelności kodu (poniżej przykład).
    |
    | Sygnatura:
    | class Curve {
    | public:
    |   enum curve_type { Bezier, NURBS, NCS };
    |   curve_type Type();
    | }
    |
    | Zastosowanie:
    | void paint(...) {
    |  // (...)
    | if (curve.Type() == Curve::NURBS)
    |   // rysuj kolorowo przedziałami
    |

*/
